﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CalculadoraMatrizes
{
    // o app deve conter transposta, inversa, soma, produto, subtração, determinante
    public partial class Form1 : Form
    {
   
        string ordem;
        private TextBox[,] Matriz3x3_1 = {};
        private TextBox[,] Matriz3x3_2 = {};
        private TextBox[,] Matriz3x3_Resultado = { };

        private TextBox[,] Matriz2x2_1 = { };
        private TextBox[,] Matriz2x2_2 = { };
        private TextBox[,] Matriz2x2_Resultado = { };

        private TextBox Determinante;
        
        private Button Calculo;

        public Form1()
        {
            InitializeComponent();

            Matriz3x3_1 = new TextBox[3, 3];
            Matriz3x3_2 = new TextBox[3, 3];
            Matriz3x3_Resultado = new TextBox[3, 3];

            Matriz2x2_1 = new TextBox[2, 2];
            Matriz2x2_2 = new TextBox[2, 2];
            Matriz2x2_Resultado = new TextBox[2, 2];

            Determinante = new TextBox();

            Calculo = new Button();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "a" || textBox1.Text == "b")
            {
                ordem = textBox1.Text;
                InstanciarMatriz(Matriz3x3_1, 44, 282);
                InstanciarMatriz(Matriz3x3_2, 190, 282);
                InstanciarMatriz(Matriz3x3_Resultado, 117, 403);
                InstanciarBotao(Calculo, 144, 364);
            }

            else if (textBox1.Text == "c")
            {
                ordem = textBox1.Text;
                InstanciarMatriz(Matriz3x3_1, 44, 282);
                InstanciarMatriz(Matriz3x3_Resultado, 117, 403);
                InstanciarBotao(Calculo, 144, 364);
            }

            else if (textBox1.Text == "d")
            {
                ordem = textBox1.Text;
                InstanciarMatriz(Matriz3x3_1, 44, 282);
                InstanciarTexto(Determinante, 162, 403);
                InstanciarBotao(Calculo, 144, 364);
            }

            else if (textBox1.Text == "e")
            {
                ordem = textBox1.Text;
                InstanciarMatriz(Matriz2x2_1, 44, 282);
                InstanciarTexto(Determinante, 162, 403);
                InstanciarBotao(Calculo, 144, 364);
            }

            else if (textBox1.Text == "f" || textBox1.Text == "g" || textBox1.Text == "k")
            {
                ordem = textBox1.Text;
                InstanciarMatriz(Matriz2x2_1, 44, 282);
                InstanciarMatriz(Matriz2x2_2, 190, 282);
                InstanciarMatriz(Matriz2x2_Resultado, 117, 403);
                InstanciarBotao(Calculo, 144, 364);
            }

            else if (textBox1.Text == "h")
            {
                ordem = textBox1.Text;
                InstanciarMatriz(Matriz2x2_1, 44, 282);
                InstanciarMatriz(Matriz2x2_Resultado, 117, 403);
                InstanciarBotao(Calculo, 144, 364);
            }

            else if (textBox1.Text == "i")
            {
                ordem = textBox1.Text;
                InstanciarMatriz(Matriz3x3_1, 44, 282);
                InstanciarMatriz(Matriz3x3_Resultado, 162, 403);
                InstanciarBotao(Calculo, 144, 364);
            }

            else if (textBox1.Text == "j")
            {
                ordem = textBox1.Text;
                InstanciarMatriz(Matriz2x2_1, 44, 282);
                InstanciarMatriz(Matriz2x2_Resultado, 162, 403);
                InstanciarBotao(Calculo, 144, 364);
            }

            else if (textBox1.Text == "l")
            {
                ordem = textBox1.Text;
                InstanciarMatriz(Matriz2x2_1, 44, 282);
                InstanciarMatriz(Matriz2x2_Resultado, 117, 403);
                InstanciarBotao(Calculo, 144, 364);
            }

            else 
            {
                MessageBox.Show("Por favor digite uma opção válida");
                textBox1.Clear();
            }
        }

        private void InstanciarTexto(TextBox Determinante, int posX, int posY)
        {
            int sizeX = 40, sizeY = 20;

            Determinante.Location = new System.Drawing.Point(posX, posY);
            Determinante.Name = "Determinante";
            Determinante.Size = new System.Drawing.Size(sizeX, sizeY);
            Determinante.TabIndex = 4;
            Determinante.Text = "";
            Controls.Add(Determinante);
        }

        private void botaoCalcular_Click(object sender, EventArgs e)
        {
            Calcular(ordem, Matriz3x3_1, Matriz3x3_2, Matriz2x2_1, Matriz2x2_2);
        }

        public void Calcular(string ordem, TextBox[,] Matriz1_3x3, TextBox[,] Matriz2_3x3, TextBox[,] Matriz1_2x2, TextBox[,] Matriz2_2x2)
        {
            if (ordem == "a" || ordem == "b" || ordem == "c" || ordem == "d" || ordem == "i")
            {
                for (int i = 0; i < Matriz1_3x3.GetLength(0); i++)
                {
                    for (int j = 0; j < Matriz1_3x3.GetLength(1); j++)
                    {
                        if (Matriz1_3x3[i, j].Text == "")
                        {
                            Matriz1_3x3[i, j].Text = "0";
                        }

                        if (ordem == "a" || ordem == "b")
                        {
                            if (Matriz2_3x3[i, j].Text == "")
                            {
                                Matriz2_3x3[i, j].Text = "0";
                            }
                        }



                    }
                }
            }
            if (ordem == "e" || ordem == "f" || ordem == "g" || ordem == "h" || ordem == "j" || ordem == "k" || ordem == "l")
            {
                for (int i = 0; i < Matriz1_2x2.GetLength(0); i++)
                {
                    for (int j = 0; j < Matriz1_2x2.GetLength(1); j++)
                    {
                        if (Matriz1_2x2[i, j].Text == "")
                        {
                            Matriz1_2x2[i, j].Text = "0";
                        }

                        if (ordem == "f" || ordem == "g" || ordem == "k")
                        {
                            if (Matriz2_2x2[i, j].Text == "")
                            {
                                Matriz2_2x2[i, j].Text = "0";
                            }
                        }
                    }
                }
            }

            if (ordem == "a")
            {
                OperacaoMatrizes3x3(Matriz3x3_1, Matriz3x3_2, Matriz3x3_Resultado, "soma");
            }

            else if (ordem == "b")
            {
                OperacaoMatrizes3x3(Matriz3x3_1, Matriz3x3_2, Matriz3x3_Resultado, "diferença");
            }

            else if (ordem == "c")
            {
                OperacaoMatrizes3x3(Matriz3x3_1, Matriz3x3_2, Matriz3x3_Resultado, "oposta");
            }

            else if (ordem == "d")
            {
                ObterDeterminante3x3(Matriz3x3_1, Determinante);
            }

            else if (ordem == "e")
            {
                ObterDeterminante2x2(Matriz2x2_1, Determinante);
            }

            else if (ordem == "f")
            {
                OperacaoMatrizes2x2(Matriz2x2_1, Matriz2x2_2, Matriz2x2_Resultado, "soma");
            }

            else if (ordem == "g")
            {
                OperacaoMatrizes2x2(Matriz2x2_1, Matriz2x2_2, Matriz2x2_Resultado, "diferença");
            }

            else if (ordem == "h")
            {
                OperacaoMatrizes2x2(Matriz2x2_1, Matriz2x2_2, Matriz2x2_Resultado, "oposta");
            }

            else if (ordem == "i")
            {
                OperacaoMatrizes3x3(Matriz3x3_1, Matriz3x3_2, Matriz3x3_Resultado, "transposta");
            }

            else if (ordem == "j")
            {
                OperacaoMatrizes2x2(Matriz2x2_1, Matriz2x2_2, Matriz2x2_Resultado, "transposta");
            }

            else if (ordem == "k")
            {
                Multiplicacao2x2(Matriz2x2_1, Matriz2x2_2, Matriz2x2_Resultado);
            }

            else if (ordem == "l")
            {
                Inversa2x2(Matriz2x2_1, Matriz2x2_Resultado);
            }
        }

        private void Inversa2x2(TextBox[,] Matriz1, TextBox[,] Resultado)
        {
            double convertido1 = Convert.ToDouble(Matriz1[0, 0].Text);
            double convertido2 = Convert.ToDouble(Matriz1[0, 1].Text);
            double convertido3 = Convert.ToDouble(Matriz1[1, 0].Text);
            double convertido4 = Convert.ToDouble(Matriz1[1, 1].Text);

            double convertido5 = 1;
            double convertido6 = 0;
            double convertido7 = 0;
            double convertido8 = 1;

            Resultado[0, 0].Text = ((convertido1 * convertido5) + (convertido2 * convertido7)).ToString();
            Resultado[0, 1].Text = ((convertido1 * convertido6) + (convertido2 * convertido8)).ToString();
            Resultado[1, 0].Text = ((convertido3 * convertido5) + (convertido4 * convertido7)).ToString();
            Resultado[1, 1].Text = ((convertido3 * convertido6) + (convertido4 * convertido8)).ToString();
        }

        private void Multiplicacao2x2(TextBox[,] Matriz1, TextBox[,] Matriz2, TextBox[,] Resultado)
        {
            double convertido1 = Convert.ToDouble(Matriz1[0,0].Text);
            double convertido2 = Convert.ToDouble(Matriz1[0,1].Text);
            double convertido3 = Convert.ToDouble(Matriz1[1,0].Text);
            double convertido4 = Convert.ToDouble(Matriz1[1,1].Text);

            double convertido5 = Convert.ToDouble(Matriz2[0,0].Text);
            double convertido6 = Convert.ToDouble(Matriz2[0,1].Text);
            double convertido7 = Convert.ToDouble(Matriz2[1,0].Text);
            double convertido8 = Convert.ToDouble(Matriz2[1,1].Text);

            Resultado[0, 0].Text = ((convertido1 * convertido5) + (convertido2 * convertido7)).ToString();
            Resultado[0, 1].Text = ((convertido1 * convertido6) + (convertido2 * convertido8)).ToString();
            Resultado[1, 0].Text = ((convertido3 * convertido5) + (convertido4 * convertido7)).ToString();
            Resultado[1, 1].Text = ((convertido3 * convertido6) + (convertido4 * convertido8)).ToString();
        }

        private void OperacaoMatrizes2x2(TextBox[,] Matriz1, TextBox[,] Matriz2, TextBox[,] Resultado, string Operacao)
        {
            for (int i = 0; i < Matriz1.GetLength(0); i++)
            {
                for (int j = 0; j < Matriz1.GetLength(1); j++)
                {
                    if (Operacao == "soma")
                    {
                        double convertido1 = Convert.ToDouble(Matriz1[i, j].Text);
                        double convertido2 = Convert.ToDouble(Matriz2[i, j].Text);
                        double result = (convertido1 + convertido2);
                        Resultado[i, j].Text = result.ToString();
                    }

                    if (Operacao == "diferença")
                    {
                        double convertido1 = Convert.ToDouble(Matriz1[i, j].Text);
                        double convertido2 = Convert.ToDouble(Matriz2[i, j].Text);
                        double result = (convertido1 - convertido2);
                        Resultado[i, j].Text = result.ToString();
                    }

                    if (Operacao == "oposta")
                    {
                        double result = -(Convert.ToDouble(Matriz1[i, j].Text));
                        Resultado[i, j].Text = result.ToString();
                    }

                    if (Operacao == "transposta")
                    {
                        Resultado[j, i].Text = Matriz1[i, j].Text;
                    }

                }
            }
        }

        private void ObterDeterminante3x3(TextBox[,] Matriz1, TextBox Resultado)
        {
            double convertido1 = Convert.ToDouble(Matriz1[0, 0].Text);
            double convertido2 = Convert.ToDouble(Matriz1[0, 1].Text);
            double convertido3 = Convert.ToDouble(Matriz1[0, 2].Text);
            double convertido4 = Convert.ToDouble(Matriz1[1, 0].Text);
            double convertido5 = Convert.ToDouble(Matriz1[1, 1].Text);
            double convertido6 = Convert.ToDouble(Matriz1[1, 2].Text);
            double convertido7 = Convert.ToDouble(Matriz1[2, 0].Text);
            double convertido8 = Convert.ToDouble(Matriz1[2, 1].Text);
            double convertido9 = Convert.ToDouble(Matriz1[2, 2].Text);

            double result1 = convertido1 * convertido5 * convertido9;
            double result2 = convertido2 * convertido6 * convertido7;
            double result3 = convertido3 * convertido4 * convertido8;
            double result4 = convertido3 * convertido5 * convertido7;
            double result5 = convertido1 * convertido6 * convertido8;
            double result6 = convertido2 * convertido4 * convertido9;

            Resultado.Text = ((result1 * result2 * result3) - (result4 * result5 * result6)).ToString();
        }

        private void ObterDeterminante2x2(TextBox[,] Matriz1, TextBox Resultado)
        {
            double convertido1 = Convert.ToDouble(Matriz1[0, 0].Text);
            double convertido2 = Convert.ToDouble(Matriz1[0, 1].Text);
            double convertido3 = Convert.ToDouble(Matriz1[1, 0].Text);
            double convertido4 = Convert.ToDouble(Matriz1[1, 1].Text);

            double result1 = convertido1 * convertido4;
            double result2 = convertido2 * convertido3;

            Resultado.Text = (result1 - result2).ToString();
        }

        public void OperacaoMatrizes3x3(TextBox[,] Matriz1, TextBox[,] Matriz2, TextBox[,] Resultado, string Operacao)
        {
            for (int i = 0; i < Matriz1.GetLength(0); i++)
            {
                for (int j = 0; j < Matriz1.GetLength(1); j++)
                {
                   if (Operacao == "soma")
                   {
                       double convertido1 = Convert.ToDouble(Matriz1[i, j].Text);
                       double convertido2 = Convert.ToDouble(Matriz2[i, j].Text);
                       double result = (convertido1 + convertido2);
                       Resultado[i, j].Text = result.ToString();
                   }

                   if (Operacao == "diferença")
                   {
                       double convertido1 = Convert.ToDouble(Matriz1[i, j].Text);
                       double convertido2 = Convert.ToDouble(Matriz2[i, j].Text);
                       double result = (convertido1 - convertido2);
                       Resultado[i, j].Text = result.ToString();
                   }

                   if (Operacao == "oposta")
                   {
                       double result = -(Convert.ToDouble(Matriz1[i, j].Text));
                       Resultado[i, j].Text = result.ToString();
                   }

                   if (Operacao == "transposta")
                   {
                       Resultado[j, i].Text = Matriz1[i, j].Text;
                   }

                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            LimparMatrizes(Matriz3x3_1, Matriz3x3_2, Matriz3x3_Resultado, Calculo, Determinante, Matriz2x2_1, Matriz2x2_2, Matriz2x2_Resultado);
        }

        public void LimparMatrizes(TextBox[,] matriz1, TextBox[,] matriz2, TextBox[,] resultado, Button calcular, TextBox determinante, TextBox[,] matriz3, TextBox[,] matriz4, TextBox[,] resultado2)
        {
                for (int i = 0; i < matriz1.GetLength(0); i++)
                {
                    for (int j = 0; j < matriz1.GetLength(1); j++)
                    {
                        Controls.Remove(matriz1[i, j]);
                    }
                }

                for (int i = 0; i < matriz2.GetLength(0); i++)
                {
                    for (int j = 0; j < matriz2.GetLength(1); j++)
                    {
                        Controls.Remove(matriz2[i, j]);
                    }
                }

                for (int i = 0; i < resultado.GetLength(0); i++)
                {
                    for (int j = 0; j < resultado.GetLength(1); j++)
                    {
                        Controls.Remove(resultado[i, j]);
                    }
                }

                for (int i = 0; i < matriz3.GetLength(0); i++)
                {
                    for (int j = 0; j < matriz3.GetLength(1); j++)
                    {
                        Controls.Remove(matriz3[i, j]);
                    }
                }

                for (int i = 0; i < matriz4.GetLength(0); i++)
                {
                    for (int j = 0; j < matriz4.GetLength(1); j++)
                    {
                        Controls.Remove(matriz4[i, j]);
                    }
                }

                for (int i = 0; i < resultado2.GetLength(0); i++)
                {
                    for (int j = 0; j < resultado2.GetLength(1); j++)
                    {
                        Controls.Remove(resultado2[i, j]);
                    }
                }

                Controls.Remove(calcular);
                Controls.Remove(determinante);
                textBox1.Clear();
        }

        public void InstanciarMatriz(TextBox[,] Matriz1, int posXinit, int posYinit)
        {
            int Xinicial = posXinit;
            int sizeX = 40, sizeY = 20;
            int element = 1;

            for (int i = 0; i < Matriz1.GetLength(0); i++)
            {
                for (int j = 0; j < Matriz1.GetLength(1); j++)
                {

                    if (j != (Matriz1.GetLength(1) - 1))
                    {
                        Matriz1[i, j] = new TextBox();
                        Matriz1[i, j].Location = new System.Drawing.Point(posXinit, posYinit);
                        Matriz1[i, j].Name = "Elemento" + element.ToString();
                        Matriz1[i, j].Size = new System.Drawing.Size(sizeX, sizeY);
                        Matriz1[i, j].TabIndex = 4;
                        Matriz1[i, j].Text = "";
                        Controls.Add(Matriz1[i, j]);
                        posXinit += (sizeX + 5);
                    }

                    else
                    {
                        Matriz1[i, j] = new TextBox();
                        Matriz1[i, j].Location = new System.Drawing.Point(posXinit, posYinit);
                        Matriz1[i, j].Name = "Elemento" + element.ToString();
                        Matriz1[i, j].Size = new System.Drawing.Size(sizeX, sizeY);
                        Matriz1[i, j].TabIndex = 4;
                        Matriz1[i, j].Text = "";
                        Controls.Add(Matriz1[i, j]);

                        posXinit = Xinicial;
                        posYinit += (sizeY + 5);
                    }
                    element++;
                }
            }

        }

        public void InstanciarBotao(Button botao, int x, int y)
        {
            botao.Location = new System.Drawing.Point(x, y);
            botao.Name = "Calcular";
            botao.Size = new System.Drawing.Size(75, 23);
            botao.TabIndex = 5;
            botao.Text = "Calcular";
            botao.UseVisualStyleBackColor = true;
            botao.Click += new System.EventHandler(this.botaoCalcular_Click);
            Controls.Add(botao);
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
